import { defineConfig } from 'vite'
import { fileURLToPath, URL } from 'node:url'

import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'

// element plus 自动按需引入插件 (AutoImport, Components, ElementPlusResolver)
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// element plus icons
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'

// vite 插件检查
import Inspect from 'vite-plugin-inspect'

// setup name 增强插件
import VueSetupExtend from 'vite-plugin-vue-setup-extend'

// gzip 压缩
import viteCompression from 'vite-plugin-compression'

// https://vite.dev/config/
export default defineConfig({
	// base: import.meta.env.VITE_APP_BASE_URL === 'production' ? './' : '/',
	base: '/',
	plugins: [
		vue(),
		vueDevTools(),
		AutoImport({
			// 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
			imports: ['vue', 'vue-router'],
			resolvers: [
				ElementPlusResolver(),
				// 自动导入图标组件
				IconsResolver({
					prefix: 'Icon',
				}),
			],
			dts: 'auto-import.d.ts', 
		}),
		Components({
			// dirs 自动加载的自定义组件目录
			dirs: ['src/components'],
			// 指定自动导入的组件位置，默认是 src/components
			// dirs: ['src/plugins'],
			resolvers: [
				ElementPlusResolver(),
				// 自动注册图标组件
				IconsResolver({
					enabledCollections: ['ep'],
				}),
			],
		}),
		Icons({
			autoInstall: true,
		}),
		Inspect(),
		VueSetupExtend(),
		// gzip 压缩
		viteCompression({
			verbose: true, // 默认即可
			disable: false, //开启压缩(不禁用)，默认即可
			deleteOriginFile: false, //删除源文件
			threshold: 10240, //压缩前最小文件大小
			algorithm: 'gzip', //压缩算法
			ext: '.gz', //文件类型
		}),
	],
	resolve: {
		// 别名
		alias: {
			'@': fileURLToPath(new URL('./src', import.meta.url))
		},
		// 自动识别扩展名
		extensions: ['.mjs', '.js', '.mts', '.ts', 'tsx', '.json', '.vue', '.md', '.json', '.mjs']
	},
	css: {
		preprocessorOptions: {
			// 全局样式变量
			scss: {
				additionalData: '@use "@/assets/css/theme.scss" as *;'
				// additionalData: `@use "sass:math";`
			}
		}
	},
	build: {
		rollupOptions: {
			output: {
				manualChunks(id) {
					if(id.includes('node_modules')) {
						return 'vendor'
					}
				}
			}
		}
	},
	server: {
		host: 'localhost',		// 主机地址
		port: 8090,				// 端口号
		open: false,			// 是否启动时自动打开浏览器
		cors: true,				// 是否跨域
		hmr: true,				// 是否开启热更新
		proxy: {
			// '/api': {
			// 	target: 'http://172.253.168.141:8080',
			// 	changeOrigin: true,
			// 	rewrite: path => path.replace(/^\/api/, '')
			// },
			'/apifox': {
				target: 'https://echo.apifox.com',
				changeOrigin: true,
				rewrite: path => path.replace(/^\/apifox/, ''),
				bypass(req, res, options) {
					// 在请求头和响应头里设置显示代理URL
					//@ts-ignore
					const proxyUrl = new URL(options.rewrite(req.url) || '', options.target)?.href || ''
					req.headers['x-req-proxyUrl'] = proxyUrl
					res?.setHeader('x-res-proxyUrl', proxyUrl)
				}
			},
		}
	}
})